package proxy_cglib;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

//代理类通过实现 MethodInterceptor 方法拦截器 实现
public class MySQLConnInterceptor implements MethodInterceptor {

    //初始化目标对象
    private Object targetObject;

    //通过构造函数，动态的向代理类中设置代理对象
    public MySQLConnInterceptor(Object targetObject){
        this.targetObject = targetObject;
    }

    /**
     * MethodInterceptor类中只实现唯一的一个方法 intercept(拦截) 实现基本功能的基础上可以添加额外的功能
     *
     * @Param o 代理对象
     * @Param method 代表目标方法 实现基础功能
     * @Param objects 代表目标方法中的所有参数
     * @Param methodProxy 代表代理的方法 比 method 用法更丰富一些
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        //在执行目标方法之前执行的额外功能
        System.out.println("已经连接mysql数据库————cglib");


        //执行基础功能，执行目标方法
        //执行顺序：方法.被调用(目标对象,方法的参数)
        //第一种方式：目标方法被目标对象调用
        Object result = method.invoke(targetObject,objects);
        //第二种方式：目标代理方法被目标对象调用
//        Object result = methodProxy.invoke(targetObject,objects);
        //第三种方式：代理对象调用父类(目标对象)的方法
//        Object result = methodProxy.invokeSuper(o,objects);


        //在执行目标方法之后执行的额外功能
        System.out.println("已经断开mysql数据库————cglib");


        return result;
    }
}
